/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef SkMaskSwizzler_DEFINED
#define SkMaskSwizzler_DEFINED

#include "include/codec/SkCodec.h"
#include "include/core/SkTypes.h"
#include "src/codec/SkSampler.h"

#include <cstdint>

class SkMasks;
struct SkImageInfo;

/*
 *
 * Used to swizzle images whose pixel components are extracted by bit masks
 * Currently only used by bmp
 *
 */
class SkMaskSwizzler : public SkSampler {
public:
    /*
     * @param masks Unowned pointer to helper class
     */
    static SkMaskSwizzler *CreateMaskSwizzler(const SkImageInfo &dstInfo, bool srcIsOpaque, SkMasks *masks,
        uint32_t bitsPerPixel, const SkCodec::Options &options);

    /*
     * Swizzle a row
     */
    void swizzle(void *dst, const uint8_t *SK_RESTRICT src);

    int fillWidth() const override
    {
        return fDstWidth;
    }

    /* *
     * Returns the byte offset at which we write to destination memory, taking
     * scaling, subsetting, and partial frames into account.
     * A similar function exists on SkSwizzler.
     */
    int swizzleWidth() const
    {
        return fDstWidth;
    }

private:
    /*
     * Row procedure used for swizzle
     */
    typedef void (*RowProc)(void *dstRow, const uint8_t *srcRow, int width, SkMasks *masks, uint32_t startX,
        uint32_t sampleX);

    SkMaskSwizzler(SkMasks *masks, RowProc proc, int subsetWidth, int srcOffset);

    int onSetSampleX(int) override;

    SkMasks *fMasks; // unowned
    const RowProc fRowProc;

    // FIXME: Can this class share more with SkSwizzler? These variables are all the same.
    const int fSubsetWidth; // Width of the subset of source before any sampling.
    int fDstWidth;          // Width of dst, which may differ with sampling.
    int fSampleX;
    int fSrcOffset;
    int fX0;
};

#endif
